/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package station;

import java.net.DatagramPacket;
import java.net.Inet4Address;
import java.net.UnknownHostException;
import java.nio.ByteBuffer;

/**
 *
 * @author safe
 */
public final class DataNaechsteNachricht {

    /**
    Datenquelle
    Das Programm steht als 32­Bit und 64­Bit Linux Executable, sowie als Java­Programm zur
    Verfügung.  Es schreibt periodisch 24 Byte Nutzdaten gemäss Aufgabenstellung in die
    Standardausgabe (stdout).
    
    Byte 0 – 9:
    Nutzdaten: Name der sendenden Station.
    Byte 10 – 23:
    Reserviert für weitere Nutzdaten
    Byte 24
    Stationsklasse ('A' oder 'B')
    Byte 25:
    Nummer des Slots, in dem die Station im nächsten Frame senden wird.
    Byte 26 – 33:
    Zeitpunkt, zu dem dieses Paket gesendet wurde. Einheit: Millisekunden
    seit dem 1.1.1970 als 8-Byte Integer, Big Endian.
     */
    private static final int MESSAGE_LENGTH = 34;
    private static byte[] naechsteNachricht = new byte[MESSAGE_LENGTH];
    private static DatagramPacket datagram = new DatagramPacket(naechsteNachricht, MESSAGE_LENGTH);

    private DataNaechsteNachricht() {
    }

    static int getMessageLength() {
        return MESSAGE_LENGTH;
    }

    static synchronized byte[] getMessageAsByte() {
        return naechsteNachricht;
    }

    static void setDestination(String ip, int port) {
        try {
            datagram.setAddress(Inet4Address.getByName(ip));
            datagram.setPort(15000);
        } catch (UnknownHostException ex) {
            System.out.println(ex.getMessage());;
        }
    }

    static void setStationClass(String name) {
        if (name.equals("A")) {
            naechsteNachricht[24] = 'A';
        } else if (name.equals("B")) {
            naechsteNachricht[24] = 'B';
        }
    }

    static synchronized long setTimestamp() {
        long timeStamp = System.currentTimeMillis() + DataAbweichungsZeit.getAbWeichungsZeit();
        ByteBuffer bb = ByteBuffer.allocate(8);
        bb.putLong(timeStamp);
        byte[] inToByte = bb.array();
        bb.clear();
        System.arraycopy(inToByte, 0, naechsteNachricht, 26, 8);
        return timeStamp;
    }

    /**
     * die generierten daten sind 24 byte lang und werden auf die ersten beiden abschnitte 
     * der nutzdaten gelegt, die trennung in die abschnitte 0-9 und 10-23 scheint sinnlos 
     */
    synchronized static void setReferenceData(byte[] referenceData) {
        System.arraycopy(referenceData, 0, naechsteNachricht, 0, 24);
    }

    synchronized static void setSlot(int slotNumber) {
        naechsteNachricht[25] = (byte) slotNumber;
    }

    static synchronized DatagramPacket getNextMessage() {
        datagram.setData(getMessageAsByte());
        return datagram;
    }
}
